/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import modelo.HibernateUtil;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pojos.Atiende;
import pojos.Ingresos;
import pojos.Paciente;
import pojos.Procesoasistencial;

/**
 *
 * @author Administrator
 */
public class IngresosDAO {

    private Session sesion;
    private Transaction tx;

    private void iniciaOperacion() throws HibernateException {
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction();
    }

    private void manejaExcepcion(HibernateException he) throws HibernateException {
        tx.rollback();
        throw new HibernateException("Error en la capa de acceso a datos", he);
    }

    public void guardaIngresos(Ingresos i) throws HibernateException {
        try {
            iniciaOperacion();
            sesion.save(i);
            tx.commit();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
    }

    public void actualizaIngresos(Ingresos i) throws HibernateException {
        try {
            iniciaOperacion();
            sesion.update(i);
            tx.commit();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
    }

    public void eliminaIngresos(Ingresos i) throws HibernateException {
        try {
            iniciaOperacion();
            sesion.delete(i);
            tx.commit();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
    }

    public Ingresos obtenIngresoPorId(int id) throws HibernateException {
        Ingresos i = null;
        try {
            iniciaOperacion();
            i = (Ingresos) sesion.get(Ingresos.class, id);
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
        return i;
    }

    public List<Ingresos> obtenListaIngresos(String consulta) throws HibernateException {
        List<Ingresos> listaIngresos = null;
        try {
            iniciaOperacion();
            listaIngresos = sesion.createQuery("from Ingresos" + consulta).list();
        } catch (HibernateException he) {
            manejaExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
        return listaIngresos;
    }

    public Vector<Ingresos> searchByCodPaciente(String filtro) {
        Vector<Ingresos> vIngresos = new Vector();
        Paciente pacientes;
        List<Atiende> listaAtiende;
        pacientes = new PacientesDAO().getPaciente(Integer.parseInt(filtro));
        listaAtiende = new AtiendeDAO().getList(pacientes);
        for (Atiende atiende : listaAtiende) {
            if (!searchByIdPA(atiende.getProcesoasistencial().getIdPa().toString()).isEmpty()) {
                vIngresos.add(searchByIdPA(atiende.getProcesoasistencial().getIdPa().toString()).get(0));
            }
        }
        return vIngresos;
    }

    public Vector<Ingresos> searchByDNI(String filtro) {
        Vector<Ingresos> vIngresos = new Vector();
        Paciente pacientes;
        List<Atiende> listaAtiende;
        pacientes = new PacientesDAO().getPaciente(filtro);
        listaAtiende = new AtiendeDAO().getList(pacientes);
        for (Atiende atiende : listaAtiende) {
            if (!searchByIdPA(atiende.getProcesoasistencial().getIdPa().toString()).isEmpty()) {
                vIngresos.add(searchByIdPA(atiende.getProcesoasistencial().getIdPa().toString()).get(0));
            }
        }
        return vIngresos;
    }

    public Vector<Ingresos> searchByIdIngreso(String filtro) {
        Vector<Ingresos> vIngresos = new Vector();
        String consulta = " where idIngreso = " + filtro;
        List<Ingresos> listaIngresos = this.obtenListaIngresos(consulta);
        for (Ingresos listaIngreso : listaIngresos) {
            vIngresos.add(listaIngreso);
        }
        return vIngresos;
    }

    public Vector<Ingresos> searchByFechaIngreso(String filtro) {
        Vector<Ingresos> vIngresos = new Vector();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = null;
        try {
            d = sdf.parse(filtro);
            List<Ingresos> listaIngresos = this.obtenListaIngresos("");
            for (Ingresos listaIngreso : listaIngresos) {
                if (listaIngreso.getFechaIngreso().toString().compareTo(d.toString()) == 0) {
                    vIngresos.add(listaIngreso);
                }
            }
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(null, "Formado de fecha debe ser yyyy-MM-dd");
        }

        return vIngresos;
    }

    public Vector<Ingresos> searchByFechaAlta(String filtro) {
        Vector<Ingresos> vIngresos = new Vector();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = null;
        try {
            d = sdf.parse(filtro);
            Timestamp d2 = new Timestamp(d.getTime());
            List<Ingresos> listaIngresos = this.obtenListaIngresos("");
            for (Ingresos listaIngreso : listaIngresos) {
                if (listaIngreso.getFechaAlta().toString().compareTo(d2.toString()) == 0) {
                    vIngresos.add(listaIngreso);
                }
            }
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(null, "Formado de fecha debe ser yyyy-MM-dd");
        }

        return vIngresos;
    }

    public Vector<Ingresos> searchByIdPA(String filtro) {
        Vector<Ingresos> vIngresos = new Vector();
        String consulta = " where procesoasistencial = " + filtro;
        List<Ingresos> listaIngresos = this.obtenListaIngresos(consulta);
        for (Ingresos listaIngreso : listaIngresos) {
            vIngresos.add(listaIngreso);
        }
        return vIngresos;
    }

    public Vector<Ingresos> searchAll() {
        Vector<Ingresos> vIngresos = new Vector();
        List<Ingresos> listaIngresos = this.obtenListaIngresos("");
        for (Ingresos listaIngreso : listaIngresos) {
            vIngresos.add(listaIngreso);
        }
        return vIngresos;
    }

    /**
     * Devuelve un Ingreso segun un Proceso Asistencial pasado como parámetro
     *
     * @param pa Proceso Asistencial del que querems saber su Ingreso asociado
     * @return El Ingreso asociada si existe. NULL, si no existe.
     * @author cvenegas
     */
    static Session sesion2;

    public static Ingresos getIngreso(Procesoasistencial pa) {
        Ingresos ingresos;
        sesion2 = HibernateUtil.getSessionFactory().openSession();//ABRIMOS UNA SESION
        sesion2.beginTransaction();//ARRANCA LA TRANSACCION
        ingresos = (Ingresos) sesion2.createQuery("FROM Ingresos WHERE procesoasistencial.idPa = '" + pa.getIdPa() + "'").uniqueResult();
        return ingresos;
    }

}
